Node.jsはHeroku dynoに搭載されているメモリ量を誤認している
Node.jsの中のV8の中のlibuvは、OSの物理メモリ総量をuv_get_total_memory()で取得している
Node.jsのos.totalmem()は、この関数を呼び出している
os.totalmem() / 1024 / 1024 / 1024
byteを1024で3回割ってGBにしている
メモリ16GBのMacbook Airで実行すると、16が返る
しかしHerokuのStandard-1X dynoで実行すると
約61.79GBが返る
大きすぎる
実際には0.5GBなのに
どうやらHerokuでos.totalmem()を実行すると、dynoのホストマシンの物理メモリ総量が返るようだ
このせいで、Herokuで動くnodeはV8の上限である1.5GB近くまでメモリを使ってしまう。自由に使っていいメモリがあると思っているので
これはHerokuに限った話ではない
Docker等のcgroupを使った環境では、uv_get_total_memory()は正しい値を返せない